#include "systemc.h"
#include "cache.h"

int sc_main(int argc, char *argv[])
{
  sc_signal< sc_logic >  cs;
  sc_signal< sc_logic >  rw;

  sc_signal< sc_lv<32> > addr;
  sc_signal< sc_lv<32> > din0;
  sc_signal< sc_lv<32> > din1;
  sc_signal< sc_lv<32> > din2;
  sc_signal< sc_lv<32> > din3;
  sc_signal< sc_logic >  set_v;   
  sc_signal< sc_logic >  din_src; // says when dirty bit is HIGH

  sc_signal< sc_logic >  rdy;
  sc_signal< sc_logic >  hit;
  sc_signal< sc_lv<25> > tout;
  sc_signal< sc_lv<32> > dout0;
  sc_signal< sc_lv<32> > dout1;
  sc_signal< sc_lv<32> > dout2;
  sc_signal< sc_lv<32> > dout3;

  cache dut("CACHE");

  /* port mapping*/
  dut.rw(rw);
  dut.cs(cs);
  dut.addr(addr);
  dut.din0(din0);
  dut.din1(din1);
  dut.din2(din2);
  dut.din3(din3);
  dut.set_v(set_v);
  dut.din_src(din_src);
  dut.rdy(rdy);
  dut.hit(hit);
  dut.tout(tout);
  dut.dout0(dout0);
  dut.dout1(dout1);
  dut.dout2(dout2);
  dut.dout3(dout3);

  sc_trace_file *f = sc_create_vcd_trace_file("c_wave");

  f->set_time_unit(100, SC_PS);

  sc_trace(f, dut.rw, "rw");
  sc_trace(f, dut.cs, "cs");
  sc_trace(f, dut.addr, "addr");
  sc_trace(f, dut.din0, "din0");
  sc_trace(f, dut.din1, "din1");
  sc_trace(f, dut.din2, "din2");
  sc_trace(f, dut.din3, "din3");
  sc_trace(f, dut.set_v, "set_v");
  sc_trace(f, dut.din_src, "din_src");
  sc_trace(f, dut.rdy, "rdy");
  sc_trace(f, dut.hit, "hit");
  sc_trace(f, dut.tout, "tout");
  sc_trace(f, dut.dout0, "dout0");
  sc_trace(f, dut.dout1, "dout1");
  sc_trace(f, dut.dout2, "dout2");
  sc_trace(f, dut.dout3, "dout3");

  /* start sim */

  rw.write(SC_LOGIC_0);
  cs.write(SC_LOGIC_0);
  addr.write(0x00000004);
  din0.write(0x00000000);
  din1.write(0x12345678);
  din2.write(0x00000000);
  din3.write(0x00000000);
  set_v.write(SC_LOGIC_0);
  din_src.write(SC_LOGIC_0);
  sc_start(2, SC_NS);

  cs.write(SC_LOGIC_1);
  rw.write(SC_LOGIC_1);
  din_src.write(SC_LOGIC_1);
  set_v.write(SC_LOGIC_1);
  sc_start(10, SC_NS);

  cs.write(SC_LOGIC_0);
  rw.write(SC_LOGIC_0);
  addr.write(0x00000008);
  sc_start(5, SC_NS);

  cs.write(SC_LOGIC_1);
  sc_start(10, SC_NS);

  cs.write(SC_LOGIC_0);
  sc_start(10, SC_NS);

  cs.write(SC_LOGIC_1);
  sc_start(10, SC_NS);
  /* end sim */

  sc_close_vcd_trace_file(f);

  return 0;
}
